package com.wzdigit.wms.basic.enums;

import java.util.*;
import com.wzdigit.wms.basic.util.enums.SystemModuleEnum;

/**
 * 发货单---单据类型
 *
 * @author Administrator
 *
 */
public enum GdnTypeEnum implements BaseEnum {

    /**
     * 成品类型
     */
    D01("D01", "销售出库", "GdnType", SystemModuleEnum.WMS),
    D03("D03", "返包出库", "GdnType", SystemModuleEnum.WMS),
    D04("D04", "借机(料)出库", "GdnType", SystemModuleEnum.WMS),
    D05("D05", "坏料批次退库", "GdnType", SystemModuleEnum.WMS),
    D06("D06", "免费出库", "GdnType", SystemModuleEnum.WMS),
    D08("D08", "零部件出库", "GdnType", SystemModuleEnum.WMS),
    D09("D09", "公司间发货出库", "GdnType", SystemModuleEnum.WMS),
    D10("D10", "公司间退货出库", "GdnType", SystemModuleEnum.WMS),
    D98("D98", "自动判检出库", "GdnType", SystemModuleEnum.WMS),
    D99("D99", "其他出库", "GdnType", SystemModuleEnum.WMS),
    /**
     * 原材料类型
     */
    D02("D02", "生产领料(多次)", "GdnType", SystemModuleEnum.RAW),
    D12("D12", "委外领料出库", "GdnType", SystemModuleEnum.RAW),
    D13("D13", "VMI出库", "GdnType", SystemModuleEnum.RAW),
    D14("D14", "内销售后仓领料单出库", "GdnType", SystemModuleEnum.RAW),
    D15("D15", "申购出库单", "GdnType", SystemModuleEnum.RAW),
    D16("D16", "报废出库单", "GdnType", SystemModuleEnum.RAW),
    D17("D17", "销售出库(供应商)", "GdnType", SystemModuleEnum.RAW),
    D18("D18", "采购退货出库", "GdnType", SystemModuleEnum.RAW),
    // D19("D19", "反冲物料生产领料单", "GdnType", SystemModuleEnum.RAW),
    //D20("D20", "不合格品退料", "GdnType", SystemModuleEnum.RAW),
    D21("D21", "易损件生产领料", "GdnType", SystemModuleEnum.RAW),
    D22("D22", "不合格凭证退货", "GdnType", SystemModuleEnum.RAW),
    D23("D23", "不同库位调拨(出)", "GdnType", SystemModuleEnum.RAW),
    D24("D24", "公司间交货出库", "GdnType", SystemModuleEnum.RAW),
    D25("D25", "公司间退货出库", "GdnType", SystemModuleEnum.RAW),
    D26("D26", "公司间交货出入库", "GdnType", SystemModuleEnum.RAW),
    D27("D27", "公司间退货出入库", "GdnType", SystemModuleEnum.RAW),
    D28("D28", "生产领料(一次)", "GdnType", SystemModuleEnum.RAW),
    D29("D29", "不同库位调拨出入", "GdnType", SystemModuleEnum.RAW),

    //盘点出库
    D50("D50", "盘点出库", "GdnType", SystemModuleEnum.RAW);

    /**
     * 枚举值
     */
    public String code;

    /**
     * 枚举名称
     */
    public String enumName;

    /**
     * 枚举实体类属性描述
     */
    public String description;

    /**
     * 系统模块标识
     */
    public SystemModuleEnum systemModule;

    GdnTypeEnum(String enumName, String description) {
        this.enumName = enumName;
        this.description = description;
    }

    GdnTypeEnum(String code, String enumName, String description) {
        this.code = code;
        this.enumName = enumName;
        this.description = description;
    }

    GdnTypeEnum(String code, String enumName, String description, SystemModuleEnum systemModule) {
        this.code = code;
        this.enumName = enumName;
        this.description = description;
        this.systemModule = systemModule;
    }

    public static List<String> getEnumBySystemModule(SystemModuleEnum systemModule) {
        List<String> list = new ArrayList<>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getSystemModule(), systemModule)) {
                list.add(value.getCode());
            }
        }
        return list;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getEnumName() {
        return enumName;
    }

    public void setEnumName(String enumName) {
        this.enumName = enumName;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public SystemModuleEnum getSystemModule() {
        return systemModule;
    }

    public void setSystemModule(SystemModuleEnum systemModule) {
        this.systemModule = systemModule;
    }

    public static GdnTypeEnum getEnumByCode(String enumCode) {
        GdnTypeEnum[] values = GdnTypeEnum.values();
        GdnTypeEnum samplingEnum = null;

        for (GdnTypeEnum value : values) {
            if (value.getCode().equals(enumCode)) {
                samplingEnum = value;
            }
        }
        return samplingEnum;
    }

    public static GdnTypeEnum getEnumByName(String enumName) {
        GdnTypeEnum[] values = GdnTypeEnum.values();
        GdnTypeEnum repairEnum = null;

        for (GdnTypeEnum value : values) {
            if (value.getEnumName().equals(enumName)) {
                repairEnum = value;
            }
        }
        return repairEnum;
    }

    public static String getCodeByEnumNameAndDescription(String enumName, String enumDescription) {
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getDescription(), enumDescription)
                    && Objects.equals(value.getEnumName(), enumName)) {
                return value.getCode();
            }
        }
        return null;
    }

    public static Map<String, String> getEnumByDescription() {
        Map<String, String> enumMap = new HashMap<String, String>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            enumMap.put(value.getCode(), value.getEnumName());
        }
        return enumMap;
    }

    public static Map<String, String> getEnumByDescription(String enumDescription) {
        Map<String, String> enumMap = new HashMap<String, String>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getDescription(), enumDescription)) {
                enumMap.put(value.getCode(), value.getEnumName());
            }
        }
        return enumMap;
    }

    public static List<Map<String, Object>> getEnumListByDescription(String enumDescription) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getDescription(), enumDescription)) {
                Map<String, Object> enumMap = new HashMap<String, Object>(2);
                enumMap.put("code", value.getCode());
                enumMap.put("name", value.getEnumName());
                list.add(enumMap);
            }
        }
        return list;
    }

    public static List<String> getCodeListBySystemModule(SystemModuleEnum systemModule) {
        List<String> list = new ArrayList<>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getSystemModule(), systemModule)) {
                list.add(value.getCode());
            }
        }
        return list;
    }

    public static List<Map<String, Object>> getEnumListBySystemModule(SystemModuleEnum systemModule) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        GdnTypeEnum[] values = GdnTypeEnum.values();
        for (GdnTypeEnum value : values) {
            if (Objects.equals(value.getSystemModule(), systemModule)) {
                Map<String, Object> enumMap = new HashMap<String, Object>(2);
                enumMap.put("code", value.getCode());
                enumMap.put("name", value.getEnumName());
                list.add(enumMap);
            }
        }
        return list;
    }
}
